﻿using GDM.Hogar.Aplicacion.Properties;
using GDM.Hogar.Controles.Validador.Componentes;
using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Agentes
{
    public partial class FrmAgente
#if DEBUG
 : AdaptadorFrm
#else
     : FrmBase
#endif
    {
        private readonly IAgenteManager _agenteManager;
        private readonly ICargoManager _cargoManager;
        private readonly IPuestoManager _puestoManager;
        private IList<Puesto> _puestos;

        public Action OnAgenteCreado;
        public Action OnAgenteActualizado; 

        public FrmAgente(IAgenteManager agenteManager, ICargoManager cargoManager, IPuestoManager puestoManager)
        {
            if (agenteManager == null)
                throw new ArgumentNullException("agenteManager");
            if (cargoManager == null)
                throw new ArgumentNullException("cargoManager");
            if (puestoManager == null)
                throw new ArgumentNullException("puestoManager");

            _agenteManager = agenteManager;
            _cargoManager = cargoManager;
            _puestoManager = puestoManager;
            InitializeComponent();
        }

        public ConsultaAgente Agente { get; set; }

        private bool EsAdministrativo
        {
            get { return ContextoUsuario.RolId == (int)Rol.Administrativo; }
        }

        protected override string Titulo
        {
            get { return "Agente"; }
        }

        private void GuardarRegistro()
        {
            if (!agenteValidador.Validate()) return;

            if (Agente != null)
            {
                //- Modo Edicion
                if (!Agente.Dni.Trim().Equals(txtDni.Text.Trim()))
                {
                        if (_agenteManager.ExisteAgente(txtDni.Text.Trim()))
                        {
                            MostrarMensajeError(string.Format(Resources.Agente_Existe, txtDni.Text.Trim()));
                            return;
                        }
                }
                ActualizarAgente();
            }
            else
            {
                //- Modo Creacion
                if (_agenteManager.ExisteAgente(txtDni.Text.Trim()))
                {
                    MostrarMensajeError(string.Format(Resources.Agente_Existe, txtDni.Text.Trim()));
                    return;
                }
                CrearAgente();
            }
        }

        private void ActualizarAgente()
        {
            var agente = InstanciarAgente();
            agente.AgenteId = Agente.AgenteId;
            try
            {
                _agenteManager.ActualizarAgente(agente);
                MostrarMensajeExito(Resources.Agente_GuardoConExito);
                if (OnAgenteActualizado != null)
                {
                    OnAgenteActualizado();
                }
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.GuardarAgente_Error);
            }
        }

        private void agenteValidador_CustomValidation(object sender, ValidationEventArgs e)
        {
            if (e.Control == cmbAreas)
            {
                e.Valid = cmbAreas.SelectedIndex > 0;
            }
            if (e.Control == cmbCargos)
            {
                e.Valid = cmbCargos.SelectedIndex > 0;
            }
            if (e.Control == cmbPuestos)
            {
                e.Valid = cmbPuestos.SelectedIndex > 0;
            }
        }

        private void CargarAreas()
        {
            cmbAreas.Items.Add("-- Seleccione un Area --");
            foreach (var item in Enum.GetValues(typeof(Area)))
            {
                cmbAreas.Items.Add(item);
            }
            cmbAreas.SelectedIndex = 0;
        }

        private void CargarCargos()
        {
            cmbCargos.CargarItems(_cargoManager.ObtenerCargos(), "Codigo", "CargoId", true, "--- Seleccione un Cargo ---");
        }

        private void CargarPuestos()
        {
            cmbPuestos.Items.Clear();
            cmbPuestos.DisplayMember = "Descripcion";
            cmbPuestos.ValueMember = "PuestoId";
            cmbPuestos.Items.Add("--- Seleccione un Puesto ---");
            if (cmbAreas.SelectedIndex > 0)
            {
                var areaId = (int)((Area)cmbAreas.SelectedItem);
                _puestos.ToList().ForEach(p => { if (p.AreaId == (int)areaId) cmbPuestos.Items.Add(p); });
                cmbPuestos.SelectedIndex = cmbPuestos.Items.Count == 2 ? 1 : 0;
                cmbPuestos.Enabled = true;
            }
            else
            {
                cmbPuestos.SelectedIndex = 0;
                cmbPuestos.Enabled = false;
            }
        }

        private void cmbAreas_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarPuestos();
        }

        private void CrearAgente()
        {
            var agente = InstanciarAgente();
            try
            {
                _agenteManager.GuardarAgente(agente);
                MostrarMensajeExito(Resources.Agente_GuardoConExito);
                LimpiarControl(panel1);
                if (OnAgenteCreado != null)
                {
                    OnAgenteCreado();
                }
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.GuardarAgente_Error);
            }
        }

        private void FrmAgente_Load(object sender, EventArgs e)
        {
            RefrescarCambios = false;
            CargarAreas();
            CargarCargos();
            _puestos = _puestoManager.ObtenerPuestos();
            if (Agente == null)
            {
                return;
            }

            MostrarDatosAgente();
            if (!Agente.Activo || !EsAdministrativo)
            {
                //- El agente debe estar activo para poder editar sus datos
                HabilitarControl(panel1, false);
                btnGuardarAgente.Visible = false;
            }
        }

        private Agente InstanciarAgente()
        {
            return new Agente
            {
                Dni = txtDni.Text.Trim(),
                Apellido = txtApellido.Text.Trim(),
                Nombre = txtNombre.Text.Trim(),
                Telefono = txtTelefono.Text.Trim(),
                Domicilio = txtDomicilio.Text.Trim(),
                Activo = true,
                AreaId = (int)((Area)cmbAreas.SelectedItem),
                CargoId = ((Cargo)cmbCargos.SelectedItem).CargoId,
                PuestoId = ((Puesto)cmbPuestos.SelectedItem).PuestoId
            };
        }

        private void MostrarDatosAgente()
        {
            txtDni.Text = Agente.Dni;
            txtNombre.Text = Agente.Nombre;
            txtApellido.Text = Agente.Apellido;
            txtTelefono.Text = Agente.Telefono;
            txtDomicilio.Text = Agente.Domicilio;
            cmbAreas.SelectedIndex = cmbAreas.FindStringExact(Agente.Area);
            cmbAreas.Enabled = false;
            cmbCargos.SelectedIndex = cmbCargos.FindStringExact(Agente.Cargo);
            cmbPuestos.SelectedIndex = cmbPuestos.FindStringExact(Agente.Puesto);
            cmbPuestos.Enabled = false;
        }

        private void btnGuardarAgente_Click(object sender, EventArgs e)
        {
            GuardarRegistro();
        }
    }
}